﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using RRHH.Competencias.Controladores;
using RRHH.Competencias.Entities;

namespace WebSite
{
    public partial class Sectores : System.Web.UI.Page
    {
        protected string codigoPantalla = "SECTORES";

        protected void Page_Load ( object sender, EventArgs e )
        {
            if (!Page.IsPostBack)
            {
                if (!Master.ValidarAcceso(codigoPantalla)) Response.Redirect("Inicio.aspx");

                MpeDetalleSector.Hide();

                btnCancelar.Attributes.Add("onclick", "return confirm('Está seguro que desea cancelar la operación');" );

                Session["ABMSectores.lsSectores"] = null;
                Session["ABMSectores.sectorUpdate"] = null;

                try
                {
                    BuscarSectores( null, null, null, chkSoloActivos.Checked, 0 );                    
                }
                catch (Exception ex)
                {
                    this.RegistrarMensajeJavascript( "Error", ex.Message );
                }
            }
        }

        private void RegistrarMensajeJavascript ( string nombre, string mensaje )
        {
            mensaje = mensaje.Replace( "'", string.Empty );
            mensaje = mensaje.Replace( "(", string.Empty );
            mensaje = mensaje.Replace( ")", string.Empty );
            mensaje = mensaje.Replace( ",", string.Empty );
            mensaje = mensaje.Replace( ";", string.Empty );
            mensaje = mensaje.Replace( "\"", string.Empty );

            ScriptManager.RegisterStartupScript( this, this.GetType(), nombre, "alert('" + mensaje + "');", true );
        }

        
        private void BuscarSectores ( long? sector_id, string nombre, string descripcion,
                                   bool activo, int pagina )
        {
            if (nombre == string.Empty)
            {
                nombre = null;
            }

            GestorSector gestorSector = new GestorSector();
            List<Sector> lsSectores = new List<Sector>();

            lsSectores = gestorSector.Buscar( sector_id, nombre, descripcion, null, activo );

            grvSectores.DataKeyNames = new string[] { "Id" };

            grvSectores.DataSource = lsSectores;
            grvSectores.PageIndex = pagina;
            grvSectores.DataBind();

            Session["ABMSectores.lsSectores"] = lsSectores;

            UpdListadoSectores.Update();
        }

        protected void btnBuscar_Click ( object sender, EventArgs e )
        {
            try
            {
                BuscarSectores( null, txtNombreBuscar.Text, txtDescripcionBuscar.Text, chkSoloActivos.Checked, 0 );
            }
            catch
            {
                this.RegistrarMensajeJavascript("Error", "No se pudo obtener el listado de sectores");
            }
        }

        private void LimpiarCampos ()
        {
            txtNombre.Text = string.Empty;
            txtDescripcion.Text = string.Empty;
            txtNombreResponsableCiclo.Text = string.Empty;
            txtCodigoResponsableCiclo.Text = string.Empty;
        }

        protected void grvSectores_PageIndexChanging ( object sender, GridViewPageEventArgs e )
        {
            try
            {
                BuscarSectores( null, txtNombreBuscar.Text, null, chkSoloActivos.Checked, e.NewPageIndex );
            }
            catch (Exception)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo obtener el listado de sectores" );
            }
        }

        protected void grvSectores_RowCommand ( object sender, GridViewCommandEventArgs e )
        {
            GestorSector gestorSector = new GestorSector();
            GestorColaborador gestorColaborador = new GestorColaborador();

            int indiceFila = 0;

            switch (e.CommandName)
            {
                case "Modificar":

                    try
                    {
                        List<Sector> lstSectores = new List<Sector>();
                        lstSectores = (List<Sector>)Session["ABMSectores.lsSectores"];
                        Sector sectorUpdate = new Sector();

                        indiceFila = Convert.ToInt16( e.CommandArgument );
                        Int64 idSector = Convert.ToInt64( grvSectores.DataKeys[indiceFila].Values["Id"] );

                        foreach (Sector sector in lstSectores)
                        {
                            if (sector.Id == idSector)
                            {
                                sectorUpdate.Id = sector.Id;
                                Session["ABMSectores.sectorUpdate"] = sectorUpdate;
                                break;
                            }
                        }

                        LimpiarCampos();

                        gestorSector.Completar( sectorUpdate );
                        if (sectorUpdate.Responsable != null)
                        {
                            gestorColaborador.Completar( sectorUpdate.Responsable );
                            if (!sectorUpdate.Responsable.Activado)
                                sectorUpdate.Responsable = null;
                        }

                        CompletarCampos( sectorUpdate );

                        btnAceptar.Visible = true;
                        btnCancelar.Visible = true;
                        btnCerrar.Visible = false;

                        MpeDetalleSector.Show();
                    }
                    catch (Exception)
                    {
                        this.RegistrarMensajeJavascript("Error","No se pudo completar la informacion del Sector");
                        return;
                    }
                    break;

                case "Activar":

                    try
                    {
                        List<Sector> lsSectores = new List<Sector>();
                        lsSectores = (List<Sector>)Session["ABMSectores.lsSectores"];
                        Sector sectorActivar = new Sector();

                        indiceFila = Convert.ToInt16( e.CommandArgument );
                        Int64 idSector = Convert.ToInt64( grvSectores.DataKeys[indiceFila].Values["Id"] );

                        foreach (Sector sector in lsSectores)
                        {
                            if (sector.Id == idSector)
                            {
                                sectorActivar = sector;
                                break;
                            }
                        }

                        gestorSector.Activar( sectorActivar );

                        BuscarSectores( null, null, null, chkSoloActivos.Checked, 0 );
                    }

                    catch (Exception)
                    {
                        this.RegistrarMensajeJavascript("Error","No se pudo registrar la operación");
                        return;
                    }
                    break;

                case "Desactivar":
                    try
                    {
                        List<Sector> lsSectores = new List<Sector>();
                        lsSectores = (List<Sector>)Session["ABMSector.lsSectores"];
                        Sector sectorDesactivar = new Sector();

                        indiceFila = Convert.ToInt16( e.CommandArgument );
                        Int64 idSector = Convert.ToInt64( grvSectores.DataKeys[indiceFila].Values["Id"] );

                        foreach (Sector sector in lsSectores)
                        {
                            if (sector.Id == idSector)
                            {
                                sectorDesactivar = sector;
                                break;
                            }
                        }

                        gestorSector.Desactivar( sectorDesactivar );

                        BuscarSectores( null, null, null, chkSoloActivos.Checked, 0 );
                    }

                    catch (Exception)
                    {
                        this.RegistrarMensajeJavascript("Error","No se pudo registrar la operación");
                        return;
                    }
                    break;

                default:
                    break;
            }

        }

        private void CompletarCampos ( Sector sector )
        {
            if (sector != null)
            {
                txtNombre.Text = sector.Nombre;
                txtDescripcion.Text = sector.Descripcion;
                if (sector.Responsable != null)
                {
                    txtCodigoResponsableCiclo.Text = sector.Responsable.IdColaborador.ToString();
                    txtNombreResponsableCiclo.Text = sector.Responsable.Apellido + ", " + sector.Responsable.Nombre;
                }
            }
        }

        protected void btnCancelar_Click ( object sender, EventArgs e )
        {
            Session["ABMSectores.sectorUpdate"] = null;
            Session["ABMSectores.lstTareasAsignadas"] = null;

            MpeDetalleSector.Hide();
        }

        protected void btnCerrar_Click ( object sender, EventArgs e )
        {
            Session["ABMSectores.sectorUpdate"] = null;
            Session["ABMSectores.lstTareasAsignadas"] = null;

            MpeDetalleSector.Hide();
            BuscarSectores( null, null, null, chkSoloActivos.Checked, 0 );
        }

        protected void btnAceptar_Click ( object sender, EventArgs e )
        {
            string errores = string.Empty;
            GestorSector gestorSector = new GestorSector();
            Sector sector = new Sector();
            Sector sectorAnterior = null;

            if (!this.ValidarDatos( out errores ))
            {
                this.RegistrarMensajeJavascript( "Error", errores );
                return;
            }

            try
            {
                sector.Nombre = txtNombre.Text;
                sector.Descripcion = txtDescripcion.Text;

                if (!string.IsNullOrEmpty( txtCodigoResponsableCiclo.Text ))
                {
                    sector.Responsable = new Colaborador();
                    sector.Responsable.IdColaborador = Convert.ToInt64( txtCodigoResponsableCiclo.Text );
                }

                if (Session["ABMSectores.sectorUpdate"] != null)//Modificación Sector
                {
                    sectorAnterior = (Sector)Session["ABMSectores.sectorUpdate"];
                    sector.Id = sectorAnterior.Id;
                    gestorSector.Modificar( sector );
                    Session["ABMSectores.sectorUpdate"] = null;
                }
                else//Nuevo Ciclo
                {
                    gestorSector.Registrar( sector );
                }

                this.RegistrarMensajeJavascript( "Aviso", "La operación se registró correctamente" );
            }
            catch (Exception ex)
            {
                //mostrar error al guardar
                this.RegistrarMensajeJavascript( "Error", "No se pudo registrar la operación. " + ex.Message);
                return;
            }

            if (sectorAnterior != null)//Registrar Log de Modificación de Sector
            {

            }

            this.btnCerrar_Click( null, null );
        }

        protected void btnNuevo_Click ( object sender, EventArgs e )
        {
            LimpiarCampos();

            btnAceptar.Visible = true;
            btnCancelar.Visible = true;
            btnCerrar.Visible = false;


            MpeDetalleSector.Show();
        }

        protected bool ValidarDatos ( out string errores )
        {
            errores = string.Empty;

            if (txtNombre.Text.Trim().Length == 0)
            {
                errores = "Debe ingresar un nombre de sector";
                return false;
            }

            if (txtDescripcion.Text.Trim().Length == 0)
            {
                errores = "Debe ingresar una descripcion de sector";
                return false;
            }

            return true;
        }

        protected void grvSectores_RowDataBound ( object sender, GridViewRowEventArgs e )
        {
            LinkButton lnkButtonActDes;
            LinkButton lnkButtonModificar;

            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                lnkButtonModificar = (LinkButton)e.Row.Cells[3].Controls[0];
                lnkButtonModificar.Text = "Modificar";

                lnkButtonActDes = (LinkButton)e.Row.Cells[4].Controls[0];

                //La fechaBaja es nula
                if (DateTime.Parse( e.Row.Cells[5].Text ) != DateTime.MinValue)
                {
                    lnkButtonActDes.Text = "Activar";
                    lnkButtonActDes.CommandName = "Activar";
                }
                else
                {
                    lnkButtonActDes.Text = "Desactivar";
                    lnkButtonActDes.CommandName = "Desactivar";
                    lnkButtonActDes.Attributes.Add( "onclick", "if (!confirm('Está seguro que desea desactivar el sector?'))return false;" );
                }
                //Oculto la columna que muestra la Fecha de Baja
                e.Row.Cells[5].Visible = false;
            }
        }

        protected void txtCodigoResponsableCiclo_TextChanged ( object sender, EventArgs e )
        {
            int codigoResponsable;

            if (int.TryParse( txtCodigoResponsableCiclo.Text, out codigoResponsable ) && codigoResponsable > 0)
            {
                Colaborador responsable = new Colaborador();
                responsable.IdColaborador = codigoResponsable;

                GestorColaborador gc = new GestorColaborador();
                gc.Completar( responsable );

                if (responsable.IdColaborador > 0)
                {
                    txtNombreResponsableCiclo.Text = responsable.Apellido + ", " + responsable.Nombre;
                }
                else
                {
                    txtNombreResponsableCiclo.Text = string.Empty;
                    txtCodigoResponsableCiclo.Text = string.Empty;
                }
            }
            else
            {
                txtNombreResponsableCiclo.Text = string.Empty;
                txtCodigoResponsableCiclo.Text = string.Empty;
            }
        }
    }
}